package service

import (
	"context"
	"demo/domain/model"
	"demo/infra/common/utils"
	"time"
)

type StatisticsService struct {
	transformEventRepo  model.TransformEventRecordRepository
	visitStatisticsRepo model.VisitStatisticsRepository
}

func NewStatisticsService(transformEventRepo model.TransformEventRecordRepository, visitStatisticsRepo model.VisitStatisticsRepository) *StatisticsService {
	return &StatisticsService{transformEventRepo: transformEventRepo, visitStatisticsRepo: visitStatisticsRepo}
}

func (s *StatisticsService) ProcessVisitStatisticsDuration(ctx context.Context, start, end time.Time) error {
	// 查询指定时间段的访问统计数据
	statsList, err := s.transformEventRepo.QueryVisitStatisticsDuration(ctx, start, end)
	if err != nil {
		return err
	}
	// 遍历统计数据，执行插入或更新操作
	for _, stats := range statsList {
		// 根据唯一键查询已有记录
		existingStats, err := s.visitStatisticsRepo.SelectByUniqueKey(
			ctx,
			utils.DateOnly.ToTime(stats.StatisticsDate),
			stats.CompressCode,
			stats.ShortURLDigest,
			stats.LongURLDigest,
		)
		if err != nil {
			return err
		}
		if existingStats == nil {
			// 不存在则插入新记录
			if err := s.visitStatisticsRepo.Save(ctx, stats); err != nil {
				return err
			}
		} else {
			// 存在则更新记录（复用ID）
			stats.ID = existingStats.ID
			if err := s.visitStatisticsRepo.Update(ctx, stats); err != nil {
				return err
			}
		}
	}
	return nil
}
